part of '../writer.dart';

class FileWriterMap implements MapWriter {
  final File file;
  FileWriterMap(this.file, {dynamic initialData});

  Json read() {
    if (!file.existsSync()) return {};
    return jsonDecode(file.readAsStringSync());
  }

  void save(Json map) => file.write(map);

  @override
  input(String key, value) {
    // 读取map，并在其中加入key/value键对

    final map = read();
    // 如果value为空，则清空map，否则将它json化后加入
    if (value == null) {
      map.remove(key);
    } else {
      map[key] = jsonfy(value);
    }
    // 将处理好的map写入到文件中
    save(map);
  }

  @override
  List<T> getList<T>(String key, {required T Function(Json raw) unzip}) {
    // 读取key中的内容
    final dynamic value = read()[key];
    // 确保value合法
    assert(value is Iterable);
    // 返回unzip后的对象
    List<T> results = [];
    for (final v in value) {
      results.add(unzip(v));
    }
    return results;
  }

  @override
  T getObject<T>(String key, {required T Function(Json raw) unzip}) {
    // 读取key中的内容
    final dynamic value = read()[key];
    // 确保value合法
    assert(value is Map);
    // 返回unzip后的对象
    return unzip(value);
  }

  // 或许整个Map还需要再优化一下，现在几个接口的漏洞还是太多了
  @override
  T getOne<T>(String key) {
    // 读取key中的内容
    final dynamic value = read()[key];
    // 如果读取出来不是原始值（或者空），则报错
    if (!isPrimitive(value)) throw BugDev("key[$key]对应的值不是Primitive");
    return value;
  }

  @override
  bool containsKey(String key) => read().containsKey(key);

  @override
  inputIf(String key, value) {
    // 如果不存在，才将value覆写进去
    if (!containsKey(key)) input(key, value);
  }
}
